{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5e611c2c746f0808",
   "metadata": {},
   "source": [
    "# ResNet 识别手写字体\n",
    "在神经网络深度增加的时候，梯度消失的问题就变得棘手了，所以 ResNet 在之前的网络中增加了改进，将残差块的输入引入到输出之中一同进行求导。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "adef965bb9526cc4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-07T07:31:10.519801Z",
     "start_time": "2025-08-07T07:31:10.512611Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "\n",
    "Image(filename='./images/ResNet 残差块.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "da240984e48d2298",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-07T07:35:22.976077Z",
     "start_time": "2025-08-07T07:35:19.715920Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "from matplotlib_inline import backend_inline\n",
    "\n",
    "# 数据集相关\n",
    "from torchvision import datasets, transforms\n",
    "from torch.utils.data import Dataset, DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d12220d3d8867529",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-07T07:35:23.031191Z",
     "start_time": "2025-08-07T07:35:22.980092Z"
    }
   },
   "outputs": [],
   "source": [
    "transform = transforms.Compose(  # 将多个图像变换操作组合在一起\n",
    "    [\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.1307,), (0.3081,))\n",
    "    ]\n",
    ")\n",
    "\n",
    "# 下载训练集\n",
    "train_data = datasets.MNIST(\n",
    "    root='./datasets/mnist/',\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "test_data = datasets.MNIST(\n",
    "    root='./datasets/mnist/',\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# 批次加载器\n",
    "train_loader = DataLoader(train_data, shuffle=True, batch_size=256)\n",
    "test_loader = DataLoader(test_data, shuffle=False, batch_size=256)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b593e30c3fcb53be",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-07T07:35:25.312165Z",
     "start_time": "2025-08-07T07:35:25.307378Z"
    }
   },
   "outputs": [],
   "source": [
    "class ResidualBlock(nn.Module):\n",
    "    def __init__(self, channels):\n",
    "        super(ResidualBlock, self).__init__()\n",
    "        self.net = nn.Sequential(\n",
    "            nn.Conv2d(channels, channels, kernel_size=3, padding=1), nn.ReLU(),\n",
    "            nn.Conv2d(channels, channels, kernel_size=3, padding=1)\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        return nn.functional.relu(self.net(x) + x)\n",
    "\n",
    "class CNN(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(CNN, self).__init__()\n",
    "        self.net = nn.Sequential(\n",
    "            nn.Conv2d(1, 16, kernel_size=5), nn.ReLU(),\n",
    "            nn.MaxPool2d(2),\n",
    "            ResidualBlock(16),\n",
    "            nn.Conv2d(16, 32, kernel_size=5), nn.ReLU(),\n",
    "            nn.MaxPool2d(2),\n",
    "            ResidualBlock(32),\n",
    "            nn.Flatten(),\n",
    "            nn.Linear(512, 10)\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        return self.net(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1882be83c9bb49c9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-07T07:35:37.943728Z",
     "start_time": "2025-08-07T07:35:37.933225Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conv2d output shape: \t torch.Size([1, 16, 24, 24])\n",
      "ReLU output shape: \t torch.Size([1, 16, 24, 24])\n",
      "MaxPool2d output shape: \t torch.Size([1, 16, 12, 12])\n",
      "ResidualBlock output shape: \t torch.Size([1, 16, 12, 12])\n",
      "Conv2d output shape: \t torch.Size([1, 32, 8, 8])\n",
      "ReLU output shape: \t torch.Size([1, 32, 8, 8])\n",
      "MaxPool2d output shape: \t torch.Size([1, 32, 4, 4])\n",
      "ResidualBlock output shape: \t torch.Size([1, 32, 4, 4])\n",
      "Flatten output shape: \t torch.Size([1, 512])\n",
      "Linear output shape: \t torch.Size([1, 10])\n"
     ]
    }
   ],
   "source": [
    "X = torch.rand(size=(1, 1, 28, 28))\n",
    "for layer in CNN().net:\n",
    "    X = layer(X)\n",
    "    print(layer.__class__.__name__, 'output shape: \\t', X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8bc8254e5b404f2d",
   "metadata": {},
   "outputs": [],
   "source": [
    "net = CNN().to('cuda')\n",
    "\n",
    "learning_rate = 0.01\n",
    "loss_fn = nn.CrossEntropyLoss()\n",
    "optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9f36127d0008fd57",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "85.19628253765404\n",
      "15.32367545645684\n",
      "12.773369723930955\n",
      "11.748417457565665\n",
      "11.185803515836596\n",
      "11.515574210323393\n",
      "11.215320116840303\n",
      "11.320933521725237\n",
      "10.99225561786443\n",
      "10.615293703973293\n"
     ]
    },
    {
     "data": {
      "image/png": "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nn322eDxCxYs0K9//Ws9+eST2rZtm376058qMTExpI77779fjz/+uD744APFxMToe9/73ohcP4ChxWrwAMKex+NRenq63nrrLc2cOTO4//vf/77a2tp044036utf/7pefPFFzZ07V5J06NAhnXHGGXr22Wd17bXX6rrrrlN9fb3eeOON4PH33nuvXnvtNX388cfavn27zj77bL355psqLi7uUUNVVZW+/vWv66233tKll14qSXr99dd15ZVX6siRI3I6ncP8UwAwlOgBAhD2duzYoba2Nl122WVKTEwMbs8995x27twZbNc9HKWnp+vss8/Wtm3bJEnbtm3TrFmzQs47a9YsffbZZ/L5fNq6datsNpsuvvjik9YyZcqU4Odjx46VJNXV1Z32NQIYWTFGFwAAp9La2ipJeu211zRu3LiQ1xwOR0gIGqy4uLh+tYuNjQ1+brFYJHWOTwIQWegBAhD2Jk2aJIfDob179yo/Pz9ky8nJCbZ79913g58fPnxY27dv17nnnitJOvfcc/XOO++EnPedd97Rl770JdlsNk2ePFl+vz9kTBGA6EUPEICwl5SUpLvvvlt33nmn/H6/LrroIjU3N+udd95RcnKyxo8fL0n60Y9+pFGjRikzM1P333+/MjIydPXVV0uS7rrrLk2fPl3Lly/X3LlzVV1drdWrV+snP/mJJCk3N1cLFy7U9773PT355JOaOnWq9uzZo7q6Ol177bVGXTqAYUIAAhARli9frtGjR6u8vFy7du1SamqqLrjgAt13333BW1ArVqzQ7bffrs8++0wFBQX63//9X9ntdknSBRdcoJdeeklLly7V8uXLNXbsWP3oRz/S9ddfH/wea9eu1X333aebb75ZjY2NOvPMM3XfffcZcbkAhhlPgQGIeF1PaB0+fFipqalGlwMgAjAGCAAAmA4BCAAAmA63wAAAgOnQAwQAAEyHAAQAAEyHAAQAAEyHAAQAAEyHAAQAAEyHAAQAAEyHAAQAAEyHAAQAAEzn/wd6VZVjF0/H2QAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epochs = 10\n",
    "losses = []\n",
    "\n",
    "for epoch in range(epochs):\n",
    "    avg_loss = 0\n",
    "    times = 0\n",
    "\n",
    "    for x, y in train_loader:\n",
    "        x = x.to('cuda')\n",
    "        y = y.to('cuda')\n",
    "        pred = net(x)\n",
    "        loss = loss_fn(pred, y)\n",
    "        avg_loss += loss.item()\n",
    "        times += 1\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "    print(avg_loss)\n",
    "    losses.append(avg_loss / times)\n",
    "\n",
    "Fig = plt.figure()\n",
    "plt.plot(range(epochs), losses)\n",
    "plt.ylabel('loss')\n",
    "plt.xlabel('epoch')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "412065b4d2fb8911",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集精准度: 98.29000091552734 %\n"
     ]
    }
   ],
   "source": [
    "# 测试网络\n",
    "correct = 0\n",
    "total = 0\n",
    "\n",
    "with torch.no_grad():\n",
    "    for (x, y) in test_loader:\n",
    "        # 获取小批次的x与y\n",
    "        x, y = x.to('cuda:0'), y.to('cuda:0')\n",
    "        Pred = net(x)\n",
    "        # 该局部关闭梯度计算功能\n",
    "        # 一次前向传播（小批量）\n",
    "        _, predicted = torch.max(Pred.data, dim=1)\n",
    "        correct += torch.sum((predicted == y))\n",
    "        total += y.size(0)\n",
    "\n",
    "print(f'测试集精准度: {100 * correct/total} %')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "faacee50e44b7d8d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b70144fae644435a8ec57d00e84bb1b1",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(FileUpload(value=(), accept='.png,.jpg,.jpeg', description='Upload'), HBox(children=(IntSlider(…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from tools.ipynb_draw import DrawCanvas\n",
    "from IPython.display import display\n",
    "from ipywidgets import Button\n",
    "from PIL import Image\n",
    "\n",
    "dc = DrawCanvas(width=48, height=48, brush_size=6)\n",
    "\n",
    "callback_button = Button(description=\"识别\")\n",
    "\n",
    "def callback(_):\n",
    "    with dc.out:\n",
    "        try:\n",
    "            np_img = dc.canvas.get_image_data(width=48, height=48)\n",
    "            img = Image.fromarray(np_img)\n",
    "            transform = transforms.Compose([\n",
    "                transforms.Grayscale(),  # 如果是彩色图像转为灰度\n",
    "                transforms.Resize((28, 28)),  # 调整大小为 28 * 28\n",
    "                transforms.ToTensor(),  # 转为张量并归一化到[0,1]\n",
    "                transforms.Normalize((0.1307,), (0.3081,))  # 标准化到[-1,1]\n",
    "            ])\n",
    "\n",
    "            # 对图像进行预处理\n",
    "            input_tensor = transform(img).unsqueeze(0).to('cuda')  # 添加batch维度 (1, 1, 28, 28)\n",
    "\n",
    "            # 3. 前向传播\n",
    "            with torch.no_grad():  # 不需要计算梯度\n",
    "                output = net(input_tensor)\n",
    "                prediction = torch.argmax(output, dim=1).item()  # 获取预测类别\n",
    "                print(prediction)\n",
    "        except BaseException as e:\n",
    "            print(str(e))\n",
    "\n",
    "callback_button.on_click(callback)\n",
    "\n",
    "\n",
    "layout = dc.get_layout()\n",
    "layout.children[1].children = layout.children[1].children + (callback_button,)\n",
    "display(layout)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
